/*
 * TacticaBitDreamTeam.java
 *
 * Created on 24 de marzo de 2007, 17:23
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.bitdreamteam;

import futbol.General;
import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
//import java.sql.Blob;
import java.util.Vector;
import java.util.ArrayList;
import java.util.Collections;
/**
 *
 * @author Administrador
 */
public class TacticaBitDreamTeam implements Tactica{
    
    
    
    private int nValores[][]={
        {-152,0,4}, // portero 1
        {-130,0,7}, // defensa 2
        {-110,-40,7}, // defensa 3
        {-80,0,7}, // defensa 4       
        {-110,40,7}, // defensa 5
        {-20,-90,7}, // centro 6
        {0,0,7}, // centro 7
        {-20,90,7}, // centro 8
        {90,-80,7}, // delantero 9
        {90,80,7}, // delantero 10
        {100,0,7} // delantero 11
    };
    
    Point jugadores[];
    Point contrarios[];
    Point bola;
    SituacionJugadores sj;
    int masLibre = -1;
    

    public String getNombre(){
        return "Bit Dream Team";
    }
    
    public Color getColor1(){
        return new Color(0xff,0x90,0);
    }
    
    public Color getColor2(){
        return Color.DARK_GRAY;
    }
    
    public Color getColorNumero(){
        return Color.WHITE;
    }
    
    public int getFuerza(int n){
        return nValores[n][2];
    }
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    
    public Vector<Comando> getComandos(SituacionJugadores sj){
        int indice,x,y;
        int mioMasCerca[];
        int exclusion[]={0,1,10,0,0,0,0,0,0,0,0};
        Vector<Comando> comandos=new Vector();
        int jugadorMasCerca = sj.getMasCercanoDeBola();
        this.sj = sj;
        jugadores = sj.getMisJugadores();
        contrarios = sj.getContrario();
        bola = sj.getBola();
        int contrarioMasCerca = sj.getContrarioMasCerca(bola.getX(), bola.getY());
        
        // Todos los jugadores a sus posiciones
        // portero
        comandos.add(new ComandoIrA(0,nValores[0][0],General.control((int)bola.getY(),-30,30)));
        comandos.add(new ComandoIrA(1,nValores[1][0],General.control((int)bola.getY(),-50,50)));
        for(int contador = 2; contador < 10; contador ++)
        {
                comandos.add(new ComandoIrA(contador,nValores[contador][0],bola.getY()));
        }
        // delantero
        comandos.add(new ComandoIrA(10,nValores[10][0],bola.getY()));

        
        // Todos a por la bola
        // defensas y centros
        for(int contador = 5; contador < 6; contador ++)
        {
            if(getDistancia(bola,jugadores[contador])<20 && getDistancia(bola,new Point(nValores[contador][0],nValores[contador][1]))<30)
                comandos.add(new ComandoIrA(contador,bola.getX(),bola.getY()));            
        }
        // centros y delanteros
        for(int contador = 6; contador < 10; contador ++)
        {
            if(getDistancia(bola,jugadores[contador])<40)
                comandos.add(new ComandoIrA(contador,bola.getX(),bola.getY()));
        }
        // delantero
        if(getDistancia(bola,jugadores[10])<40)
            comandos.add(new ComandoIrA(10,bola.getX(),bola.getY()));
        // defensa
        if(getDistancia(bola,jugadores[1])<40)
            comandos.add(new ComandoIrA(1,bola.getX(),bola.getY()));            
        // portero
        else if(getDistancia(bola,jugadores[0])<30)
            comandos.add(new ComandoIrA(0,bola.getX(),bola.getY()));
        
        
        
        indice = 4;
        // cubrimos a los que estan en nuestro campo
        for(int contador = 10; contador >= 0; contador --)
        {
            // si el contrario esta en nuestro campo
            mioMasCerca = sj.getInfoMasCercano(jugadores,contrarios[contador],exclusion,false);
            x = (int)contrarios[contador].getX();
            if(bola.getX() > x)
                x += 14;
            else
                x -= 14;
            y = (int) situaVertical(bola,contrarios[contador],x);            
            // si es un defensa
            if(indice<11)
            {
                if(mioMasCerca[0]>-1)
                {
                    if(getDistancia(bola,new Point((int)jugadores[mioMasCerca[0]].getX(),(int)jugadores[mioMasCerca[0]].getX())) < 25)
                        comandos.add(new ComandoIrA(mioMasCerca[0],bola.getX(),bola.getY()));
                    else
                    {
                        comandos.add(new ComandoIrA(mioMasCerca[0],x,y));
                        exclusion[indice++]=mioMasCerca[0];
                    }
                }
                else
                {
                    mioMasCerca[0] = sj.getMiJugadorMasCerca(x,y);
                    if(getDistancia(bola,new Point((int)jugadores[mioMasCerca[0]].getX(),(int)jugadores[mioMasCerca[0]].getX())) < 25)
                        comandos.add(new ComandoIrA(mioMasCerca[0],bola.getX(),bola.getY()));
                    else
                    {
                        comandos.add(new ComandoIrA(mioMasCerca[0],x,y));
                        exclusion[indice++]=mioMasCerca[0];
                    }

                }
            }
        }
        
        
        
        // Estoy mas cerca de la bola
        if(sj.estoyMasCercaDeBola())
        {
            // sacamos del centro?
            if(bola.getY() == 0 && bola.getX() == 0)
                comandos.add(new ComandoPase(jugadorMasCerca,6));
            else if(getDistancia(bola,jugadores[jugadorMasCerca]) < 15)
            {
                if(jugadorMasCerca == 0)
                    comandos.add(new ComandoPase(jugadorMasCerca,1));
                else if(bola.getX()>50)
                    comandos.add(new ComandoTiroAPuerta(jugadorMasCerca,0));
                else
                {
                    int alLado;
                    for(int contador=1;contador<11;contador++)
                    {
                        alLado = sj.getContrarioMasCerca(contador);
                        if(General.getDistancia(jugadores[contador].getX(),jugadores[contador].getY(),
                                        contrarios[alLado].getX(),jugadores[contador].getY()) > 40)
                            comandos.add(new ComandoTiroAPuerta(jugadorMasCerca,contador));                                        
                        else
                            comandos.add(new ComandoTiroAPuerta(jugadorMasCerca,0));
                            
                    }
                }
            }
        }
        // si se da el caso de que nunca la cogiesemos
        else if(getDistancia(bola,jugadores[jugadorMasCerca])<15)
            comandos.add(new ComandoTiroAPuerta(jugadorMasCerca,0));
        
        return comandos;
    }
    
    double getDistancia(Point uno, Point dos)
    {
            return General.getDistancia(uno.getX(),uno.getY(),dos.getX(),dos.getY());
    }    

    double situaVertical(Point bola, Point contrario, double x)
    {
        double m = 0;
        double b = 0;
        try
        {
            m = (bola.getY()-contrario.getY()) / (bola.getX()-contrario.getX());
            b = (contrario.getY() * bola.getX() - bola.getY() * contrario.getX()) / (bola.getX()-contrario.getX());
        }
        catch(Exception ex)
        {
        }
        return m*x + b;
    }
    
    
    
}
